package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.mapper.CategoryMapper;
import com.itheima.reggie.mapper.SetmealMapper;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年11月16日
 * @description ：
 * @version: 1.0
 */
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

    @Autowired
    private SetmealDishService setmealDishService;
    // 操作什么表 需要什么service

    /**
     * 实现 解析  前端接收的数据 setmealDto
     *   把这个数据 解析出来
     *       setmeal内容 存到  setmeal表中
     *       套餐菜品相关内容 存到 setmeal_dish表中
     * @param setmealDto
     */
    @Override
    @Transactional
    public void saveWithDish(SetmealDto setmealDto) {

        // 保存套餐基本信息
//        save(传递一个套餐数据);
        Setmeal setmeal = setmealDto;//多态
        save(setmeal);// 保存套餐基本信息
        // 先获取 生成的id
        Long setmealId = setmeal.getId();
        // 保存 套餐菜品关联数据
        // 套餐菜品相关数据 在集合
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        ///遍历给每一个 关联信息添加套餐id
        for (SetmealDish setmealDish : setmealDishes) {
            setmealDish.setSetmealId(setmealId);//添加套餐id
        }
        // 存储 到 setmealdish表中
        setmealDishService.saveBatch(setmealDishes);

    }

    /**
     * 删除套餐同时 要根据套餐id 在去 setmeal_dish表中删除对应的 套餐菜品关系信息
     * @param ids
     */
    @Override
    @Transactional
    public void removeWithDish(List<Long> ids) {

        // 删除 setmeal表中的 套餐
        // 是不是所有套餐都能删?  还得有点要求...
       // 1 判断一下  这些ids对应的 setmeal是否包含 已经启售的套餐
        //  用sql语句 查一查 这些 ids对应的套餐中有几个 启售套餐
        // select count(*) from setmeal where id in (1,3,4) and status=1
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(Setmeal::getId,ids);// where id in (1,3,4)
        wrapper.eq(Setmeal::getStatus,1);// and status=1
        // 查个数
        int count = this.count(wrapper);//这个方法是 mp中定义的
        //  select count(*) from setmeal  where id in (1,3,4) and status=1

        // 个数>0
        // 如果有就不能删除  抛出异常
        if(count>0){
            throw new CustomException("套餐正在售卖中...请勿删除");
        }
        // 没有抛代表能删
        this.removeByIds(ids);//批量删除

        // 删除 setmealdish表中的 关联信息
        // delete from setmea_dish where setmeal_id in ....
        LambdaQueryWrapper<SetmealDish> wrapper2 = new LambdaQueryWrapper<>();
        wrapper2.in(SetmealDish::getSetmealId,ids);
        //删除关联数据
        setmealDishService.remove(wrapper2);




        // 我们没有写外键关联  无所谓  如果写了外键关联 删外建表 再删主键表

    }
}
